package persistencia;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import negocio.Cliente;

public class MyClienteDAO extends ConexaoMySQLDAO{
    
    private PreparedStatement stIncluirCliente;
    private PreparedStatement stPesquisaCodigo;
    private PreparedStatement stPesquisaNome;
    private PreparedStatement stPesquisaLogin;
    private PreparedStatement stListar;
    private PreparedStatement stAtualizaCliente;
    private final Connection con;
    
    public MyClienteDAO() throws IOException, SQLException {
        con = super.getConexao();
        stIncluirCliente = con.prepareStatement(
                "INSERT INTO usuario (login, senha, nome, "
                + "email1, email2, telefone1, telefone2, telefone3, "
                + "cep, numero, complemento, cnpj, contato, "
                + "nivel) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", PreparedStatement.RETURN_GENERATED_KEYS);
        stListar = con.prepareStatement(
                "SELECT * FROM usuario");
        stPesquisaCodigo = con.prepareStatement(
                "SELECT * FROM usuario WHERE codigo=?");
        stPesquisaNome = con.prepareStatement(
                "SELECT * FROM usuario WHERE nome LIKE ?");
        stPesquisaLogin = con.prepareStatement(
                "SELECT * FROM usuario WHERE login LIKE ?");
        stAtualizaCliente = con.prepareStatement(
                "UPDATE usuario SET login = ?, senha = ?, nome = ?,"
                + "email1 = ?, email2 = ?, telefone1 = ?, telefone2 = ?, telefone3 = ?,"
                + " cep = ?, numero = ?, complemento = ?, cnpj = ?, contato = ?, " 
                + " nivel = ? WHERE id_usuario = ?");
    }

    public void adiciona(Cliente umCliente) throws Exception{
        stIncluirCliente.setString(1, umCliente.getLogin());
        stIncluirCliente.setString(2, umCliente.getSenha());
        stIncluirCliente.setString(3, umCliente.getNome());
        stIncluirCliente.setString(4, umCliente.getEmail1());
        stIncluirCliente.setString(5, umCliente.getEmail2());
        stIncluirCliente.setInt(6, umCliente.getTelefone1());
        stIncluirCliente.setInt(7, umCliente.getTelefone2());
        stIncluirCliente.setInt(8, umCliente.getTelefone3());
        stIncluirCliente.setInt(9, umCliente.getCepNumero());
        stIncluirCliente.setInt(10, umCliente.getNumero());
        stIncluirCliente.setString(11, umCliente.getComplemento());
        stIncluirCliente.setString(12, umCliente.getCPF_CPNJ());
        stIncluirCliente.setString(13, umCliente.getContato());
        stIncluirCliente.setInt(14, umCliente.getNivel());
        stIncluirCliente.executeUpdate();
        //return stIncluirCliente.getGeneratedKeys().getInt(1);
    }

    public List<Cliente> getClientes() throws Exception{
        List<Cliente> tmp = new ArrayList<Cliente>();
        ResultSet rs = stListar.executeQuery();
        Cliente umCliente;
        while(rs.next()){
            umCliente = new Cliente(rs.getInt("id_usuario"), rs.getString("login"), rs.getString("senha"), rs.getString("nome"),
            rs.getString("email1"), rs.getString("email2"), rs.getInt("telefone1"), rs.getInt("telefone2"),
            rs.getInt("telefone3"), rs.getInt("cep"), rs.getInt("numero"), rs.getString("complemento"),
            rs.getString("cnpj"), rs.getString("contato"), rs.getInt("nivel"));
            tmp.add(umCliente);
        }
        return tmp;
    }

    public void altera(Cliente novoCliente) throws SQLException{
        stAtualizaCliente.setString(1, novoCliente.getLogin());
        stAtualizaCliente.setString(2, novoCliente.getSenha());
        stAtualizaCliente.setString(3, novoCliente.getNome());
        stAtualizaCliente.setString(4, novoCliente.getEmail1());
        stAtualizaCliente.setString(5, novoCliente.getEmail2());
        stAtualizaCliente.setInt(6, novoCliente.getTelefone1());
        stAtualizaCliente.setInt(7, novoCliente.getTelefone2());
        stAtualizaCliente.setInt(8, novoCliente.getTelefone3());
        stAtualizaCliente.setInt(9, novoCliente.getCepNumero());
        stAtualizaCliente.setInt(10, novoCliente.getNumero());
        stAtualizaCliente.setString(11, novoCliente.getComplemento());
        stAtualizaCliente.setString(12, novoCliente.getCPF_CPNJ());
        stAtualizaCliente.setString(13, novoCliente.getContato());
        stAtualizaCliente.setInt(14, novoCliente.getNivel());
        stAtualizaCliente.executeUpdate();
    }

    public List<Cliente> procuraPorNome(String chave) throws Exception {
        stPesquisaNome.setString(1, chave+"%");
        return getLista(stPesquisaNome.executeQuery());
    }

    public Cliente procuraPorCodigo(int codigo) throws Exception {
        stPesquisaCodigo.setInt(1, codigo);
        List<Cliente> res = getLista(stPesquisaCodigo.executeQuery());
        if(res.isEmpty()) 
            throw new Exception("Registro não encontrado");
        return res.get(0);
    }

    private List<Cliente> getLista(ResultSet rs) throws Exception {
        List<Cliente> tmp = new ArrayList<Cliente>();
        while (rs.next()) {
            tmp.add(new Cliente(rs.getInt("id_usuario"), rs.getString("login"), rs.getString("senha"), rs.getString("nome"), rs.getString("email1"), rs.getString("email2"), rs.getInt("telefone1"), rs.getInt("telefone2"), rs.getInt("telefone3"), rs.getInt("cep"), rs.getInt("numero"), rs.getString("complemento"), rs.getString("cnpj"), rs.getString("contato"), rs.getInt("nivel")));
        }
        return tmp;
    }    
}